

package MODELO;

import java.lang.String;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ModeloProducto extends Conexion{
	private String codigo;
	private String  cod_categoria;
	private String  descripcion;
	private String  status;
	private double precio;
    
    
    public ModeloProducto(){    		
            super();
    }

    public boolean registar(){
        getConexion();
        boolean sw = false;
        String tira="INSERT INTO Producto (codigo, Cod_Categoria, descripcion, precio, status ) VALUES(?,?,?,?,?)";
        try {
        	PreparedStatement stam = generarPreparedStatement(tira);
        	stam.setString(1, getCodigo());
            stam.setString(2, getCod_categoria());
            stam.setString(3, getDescripcion().toLowerCase());
            stam.setDouble(4, getPrecio());
            stam.setString(5, getStatus());
            ejecutarPrepare(stam);
            sw = true;
        } catch (SQLException ex) {
            Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return sw;
    }
    

    public void registarIngredientes(Vector<String> codigos,Vector<Double> cantidades){
        getConexion();
        for (int i = 0; i < cantidades.size(); i++){
            String sql="INSERT INTO IngredienteXProducto (cod_ing, cod_pro, cantidad, status) VALUES(?,?,?,'A')";
            try {
            	PreparedStatement stam = generarPreparedStatement(sql);
                stam.setString(1, codigos.elementAt(i));
                stam.setString(2,getCodigo());
                stam.setDouble(3, cantidades.elementAt(i));
                ejecutarPrepare(stam);
            } catch (SQLException ex) {
                Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        
    } 

  public Vector<ModeloProducto> listar(){
    Vector<ModeloProducto> v = new Vector<ModeloProducto>();
    String tira="SELECT * FROM Producto WHERE status='A'";
    getConexion();
    try {
        ResultSet rs = consultar(tira);
        while (rs.next()){
            ModeloProducto  i = new ModeloProducto();
            i.setDescripcion(rs.getString("descripcion"));
            i.setCodigo(rs.getString("codigo"));
            i.setPrecio(rs.getFloat("precio"));
            i.setStatus(rs.getString("status"));
            i.setCod_categoria(rs.getString("cod_categoria"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String []> ingredientesMasUsados(boolean orden){
    Vector<String []> v = new Vector<String []>();
    String tira="SELECT cantidades , descripcion , codigo FROM  Ingrediente,(SELECT SUM(cantidad) AS cantidades,cod_ing AS cod_TablaAux FROM IngredientexProducto GROUP BY cod_ing) TablaAux WHERE Ingrediente.codigo=TablaAux.cod_TablaAux ORDER BY cantidades ";
    if(orden)
        tira+= "asc";
    else
        tira+= "desc";
    getConexion();
    try {
        ResultSet rs = consultar(tira);   
        while (rs.next()){
            String [] s = {rs.getString(2), ""+rs.getDouble(1)};
            v.add(s);
        }
  } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }
  
  public Vector<String []> listarVentas(boolean orden){
    Vector<String []> v = new Vector<String []>();
    String tira="SELECT descripcion, (precio*TablaAux.cantidades), TablaAux.cantidades, codigo FROM  Producto, (SELECT sum(ProductoXOrden.cantidad) as cantidades, ProductoXOrden.cod_pro AS cod_TablaAux FROM ProductoXOrden GROUP BY ProductoXOrden.cod_pro) TablaAux WHERE TablaAux.cod_TablaAux=codigo AND status='A' ORDER BY(TablaAux.cantidades,(precio*TablaAux.cantidades)) ";
    if(orden)
        tira+= "asc";
    else
        tira+= "desc";
    getConexion();   
    try{
        ResultSet rs= consultar(tira);
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getDouble(2), ""+rs.getDouble(3), rs.getString(4)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(ModeloProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean revisarStockIngredientes(int cantidad){
    Vector<ModeloIngrediente> v = new Vector<ModeloIngrediente>();
    Vector<Double> d = new Vector<Double>();
    String tira="SELECT Ingrediente.codigo,IngredientexProducto.cantidad FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.status='A' AND Producto.status='A' AND Ingrediente.codigo=IngredientexProducto.cod_ing AND Producto.codigo=IngredientexProducto.cod_pro AND Producto.codigo=?";
    getConexion();   
    try{
    	PreparedStatement stam = generarPreparedStatement(tira);
        stam.setString(1, getCodigo());
        ResultSet rs =consultarPrepare(stam);
        while(rs.next()){
            ModeloIngrediente  i = new ModeloIngrediente();
            i.setCodigo(rs.getString(1));
            d.add(rs.getDouble(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     
     for (int i = 0; i < v.size(); i++)
         if(!(v.elementAt(i).revisarStock(d.elementAt(i)*cantidad))){
          return false;
         }
     return true;
  }

 public void actualizarStockIngredientes(){
	 Vector<ModeloIngrediente> v = new Vector<ModeloIngrediente>();
	    Vector<Double> d = new Vector<Double>();
	    String tira="SELECT Ingrediente.codigo,IngredientexProducto.cantidad FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.status='A' AND Producto.status='A' AND Ingrediente.codigo=IngredientexProducto.cod_ing AND Producto.codigo=IngredientexProducto.cod_pro AND Producto.codigo=?";
	    getConexion();   
	    try{
	    	PreparedStatement stam = generarPreparedStatement(tira);
	        stam.setString(1, getCodigo());
	        ResultSet rs =consultarPrepare(stam);
	        while(rs.next()){
	            ModeloIngrediente  i = new ModeloIngrediente();
	            i.setCodigo(rs.getString(1));
	            d.add(rs.getDouble(2));
	            v.add(i);
	         }
	     } catch (SQLException ex) {
	            Logger.getLogger(ModeloIngrediente.class.getName()).log(Level.SEVERE, null, ex);
	     }
     
     for (int i = 0; i < v.size(); i++){
         v.elementAt(i).consultar();
         v.elementAt(i).setStock(v.elementAt(i).getStock()-d.elementAt(i));
         v.elementAt(i).restarStock();
     }
  }

public String getCodigo() {
	return codigo;
}

public void setCodigo(String codigo) {
	this.codigo = codigo;
}

public String getCod_categoria() {
	return cod_categoria;
}

public void setCod_categoria(String cod_categoria) {
	this.cod_categoria = cod_categoria;
}

public String getDescripcion() {
	return descripcion;
}

public void setDescripcion(String descripcion) {
	this.descripcion = descripcion;
}

public String getStatus() {
	return status;
}

public void setStatus(String status) {
	this.status = status;
}

public double getPrecio() {
	return precio;
}

public void setPrecio(double precio) {
	this.precio = precio;
}


    



}
